package net.lzzy.practicesapi1.services;

import net.lzzy.practicesapi1.entities.Applicant;
import net.lzzy.practicesapi1.entities.Course;

import java.util.List;
import java.util.UUID;


/**
 * @author locker
 */
public interface ApplicantService {
    /**
     * 学生申请注册某课程
     * @param studentId 学生id
     * @param courseId 课程id
     * @param token token
     * @return 注册完返回注册记录对象
     */
    Applicant apply(UUID studentId, UUID courseId, String token);

    /**
     * 获取某学生注册的所有课程
     * @param studentId 学生id
     * @param token token
     * @return 注册的课程集合
     */
    List<Applicant> getAllCourses(UUID studentId, String token);

    /**
     * 获取某学生注册成功的正式课程记录
     * @param studentId 学生id
     * @param token token
     * @return 注册成功的课程集合
     */
    List<Applicant> getEnrolledCourses(UUID studentId, String token);

    /**
     * 获取某学生申请中的课程记录
     * @param studentId 学生id
     * @param token token
     * @return 申请中的课程记录
     */
    List<Applicant> getApplyingCourses(UUID studentId, String token);

    /**
     * 获取某学生申请失败的课程记录
     * @param studentId 学生id
     * @param token token
     * @return 申请失败的课程记录
     */
    List<Applicant> getDeclinedCourses(UUID studentId, String token);

    /**
     * 教师审批课程学习申请
     * @param applicantId 申请记录id
     * @param token token
     * @return 审批后返回申请记录对象
     */
    Applicant approve(UUID applicantId, String token);

    /**
     * 教师驳回课程申请
     * @param applicantId 申请记录id
     * @param token token
     * @return 审批后返回的记录对象
     */
    Applicant decline(UUID applicantId, String token);

    /**
     * 获取某课程的所有申请成功的注册记录
     * @param courseId 课程id
     * @param token token
     * @return 符合条件的课程申请记录
     */
    List<Applicant> getEnrolledStudents(UUID courseId, String token);

    /**
     * 获取某课程申请中的记录
     * @param courseId 课程id
     * @param token token
     * @return 符合提交的课程申请记录
     */
    List<Applicant> getApplyingStudents(UUID courseId, String token);

    /**
     * 获取某课程已驳回的申请记录
     * @param courseId 课程id
     * @param token token
     * @return 符合条件的课程申请记录
     */
    List<Applicant> getDeclinedStudents(UUID courseId, String token);

    /**
     * 从课程的正式学生列表中移除某学生
     * @param courseId 课程id
     * @param studentId 要移除的学生id
     * @param token 教师token
     * @return 操作完成后返回新的课程信息给前端
     */
    Course removeStudent(UUID courseId, UUID studentId, String token);
}
